c++ - Visual C++ volatile
全部标签 (与此问题IsItSafetoCastAwayvolatile?相关,但不完全相同,因为该问题与特定实例有关)是否有过抛弃volatile被不视为危险做法的情况?(一个特别的例子:如果声明了一个函数voidfoo(long*pl);我必须实现voidbar(volatilelong*pl);由于我的部分实现需要bar()调用foo(pl),那么我似乎无法让它按原样工作,因为编译foo()和编译bar()的调用者不兼容。)作为推论,如果我有一个volatile变量v,并且我想用别人的函数voidfoo(long*pl),那个人告诉我它是安全的,我可以在调用之前直接转换指针,我的直觉是告诉
我知道当从多个线程或进程写入的内存位置读取时,volatile关键字应该用于该位置,如下面的某些情况,但我想了解更多有关哪些限制的信息它真的对编译器有用吗?基本上编译器在处理这种情况时必须遵循什么规则,是否存在任何异常(exception)情况,尽管同时访问内存位置,但程序员可以忽略volatile关键字。volatileSomeType*ptr=someAddress;voidsomeFunc(volatileconstSomeType&input){//functionbody} 最佳答案 你知道的都是假的。Volatile不用
我知道当从多个线程或进程写入的内存位置读取时,volatile关键字应该用于该位置,如下面的某些情况,但我想了解更多有关哪些限制的信息它真的对编译器有用吗?基本上编译器在处理这种情况时必须遵循什么规则,是否存在任何异常(exception)情况,尽管同时访问内存位置,但程序员可以忽略volatile关键字。volatileSomeType*ptr=someAddress;voidsomeFunc(volatileconstSomeType&input){//functionbody} 最佳答案 你知道的都是假的。Volatile不用
自VisualC++2005起,Microsoft对C++标准不要求的volatile类型的访问做出了额外的排序保证。C++标准中是否确实禁止了这些保证?TheMicrosoftdocumentation好像是这么想的。请让我知道标准是否允许微软实现的排序,并对这个错误报告进行投票:/volatile:msdocumentationmangleswhat"ISOcompliant"means 最佳答案 只要满足标准规定的要求,实现当然可以做超出要求的事情。向volatile对象添加释放/获取语义肯定在范围内。我认为C++委员会没有兴
自VisualC++2005起,Microsoft对C++标准不要求的volatile类型的访问做出了额外的排序保证。C++标准中是否确实禁止了这些保证?TheMicrosoftdocumentation好像是这么想的。请让我知道标准是否允许微软实现的排序,并对这个错误报告进行投票:/volatile:msdocumentationmangleswhat"ISOcompliant"means 最佳答案 只要满足标准规定的要求,实现当然可以做超出要求的事情。向volatile对象添加释放/获取语义肯定在范围内。我认为C++委员会没有兴
volatileuint8_treset_mask[768]={0}现在我在内部操作之一期间将此数组元素的值设置为1。在另一个函数调用中,我需要将此数组的所有元素设置为0。一种方法是使用for循环,但我相信分配数组所有元素的更好方法是使用memsetmemset(reset_mask,0,sizeof(reset_mask));但我收到此错误:-“从类型'volatileuint8_t*{akavolatileunsignedchar*}'类型转换为类型'void*'抛弃限定符”如果我们不能在这里使用memset,有没有更好的方法一次性设置这个volatile数组的所有元素?
volatileuint8_treset_mask[768]={0}现在我在内部操作之一期间将此数组元素的值设置为1。在另一个函数调用中,我需要将此数组的所有元素设置为0。一种方法是使用for循环,但我相信分配数组所有元素的更好方法是使用memsetmemset(reset_mask,0,sizeof(reset_mask));但我收到此错误:-“从类型'volatileuint8_t*{akavolatileunsignedchar*}'类型转换为类型'void*'抛弃限定符”如果我们不能在这里使用memset,有没有更好的方法一次性设置这个volatile数组的所有元素?
我认为以下将给我10个volatile整数volatileintfoo[10];但是,我认为以下内容不会做同样的事情。volatileint*foo;foo=malloc(sizeof(int)*10);如果我对此有误以及如何使用malloc获得易变的项目数组,请纠正我。谢谢。 最佳答案 intvolatile*foo;从右到左读取“foo是一个指向volatileint的指针”所以无论你通过foo访问什么int,这个int都会是volatile。附言int*volatilefoo;//"fooisavolatilepointert
我认为以下将给我10个volatile整数volatileintfoo[10];但是,我认为以下内容不会做同样的事情。volatileint*foo;foo=malloc(sizeof(int)*10);如果我对此有误以及如何使用malloc获得易变的项目数组,请纠正我。谢谢。 最佳答案 intvolatile*foo;从右到左读取“foo是一个指向volatileint的指针”所以无论你通过foo访问什么int,这个int都会是volatile。附言int*volatilefoo;//"fooisavolatilepointert
在一个dll项目中,函数是这样的:extern"C"__declspec(dllexport)voidfoo(constwchar_t*a,constwchar_t*b,constwchar_t*c)在另一个项目中,我将使用foo函数,但我在头文件中声明foo函数extern"C"__declspec(dllimport)voidfoo(constwchar_t*a,constwchar_t*b)我只用两个参数调用它。结果是成功,我认为是关于__cdecl调用,但我想知道它是如何以及为什么起作用的。 最佳答案 32位默认调用约定是_